package com.example.gaodemap.service;

import com.example.gaodemap.config.GaodemapConfig;
import com.example.gaodemap.dto.StaticMapRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.List;
import java.util.stream.Collectors;

/**
 * GaodemapService
 * 负责拼接高德静态地图API的URL，处理参数格式，调用高德API并返回结果
 */
@Service
public class GaodemapService {
    // 注入高德API配置对象，包含key和基础URL
    @Autowired
    private GaodemapConfig config;

    // 注入Spring的RestTemplate，用于发起HTTP请求
    @Autowired
    private RestTemplate restTemplate;

    /**
     * 生成静态地图URL，拼接所有参数
     * @param request 前端传来的地图参数对象
     * @return 拼接好的高德API请求URL
     */
    public String generateStaticMapUrl(StaticMapRequest request) {
        StringBuilder urlBuilder = new StringBuilder(config.getStaticMapUrl());
        urlBuilder.append("?");
        // 添加中心点经纬度
        if (request.getLocation() != null) {
            urlBuilder.append("location=").append(request.getLocation()).append("&");
        }
        // 添加缩放级别
        if (request.getZoom() != null) {
            urlBuilder.append("zoom=").append(request.getZoom()).append("&");
        }
        // 添加图片大小
        if (request.getSize() != null) {
            urlBuilder.append("size=").append(request.getSize()).append("&");
        }
        // 添加图片质量
        if (request.getScale() != null) {
            urlBuilder.append("scale=").append(request.getScale()).append("&");
        }
        // 添加交通路况
        if (request.getTraffic() != null) {
            urlBuilder.append("traffic=").append(request.getTraffic()).append("&");
        }
        // 优先使用markersRaw
        if (request.getMarkersRaw() != null && !request.getMarkersRaw().isEmpty()) {
            urlBuilder.append("markers=").append(request.getMarkersRaw()).append("&");
        } else if (request.getMarkers() != null && !request.getMarkers().isEmpty()) {
            urlBuilder.append("markers=").append(buildMarkersParam(request.getMarkers())).append("&");
        }
        // 添加标签参数
        if (request.getLabels() != null && !request.getLabels().isEmpty()) {
            urlBuilder.append("labels=").append(buildLabelsParam(request.getLabels())).append("&");
        }
        // 添加路径参数
        if (request.getPaths() != null && !request.getPaths().isEmpty()) {
            urlBuilder.append("paths=").append(buildPathsParam(request.getPaths())).append("&");
        }
        // 添加API Key
        urlBuilder.append("key=").append(config.getKey());
        return urlBuilder.toString();
    }

    /**
     * 构建markers参数，label为空时不多加逗号，只允许label为英文或数字，不能为中文
     * @param markers 标注点列表
     * @return 拼接好的markers参数字符串
     */
    private String buildMarkersParam(List<StaticMapRequest.Marker> markers) {
        return markers.stream()
            .map(marker -> {
                StringBuilder markerStr = new StringBuilder();
                markerStr.append(marker.getStyle() != null ? marker.getStyle() : "mid").append(",");
                markerStr.append(marker.getColor() != null ? marker.getColor() : "");
                markerStr.append(",");
                markerStr.append(marker.getLabel() != null ? marker.getLabel() : "");
                markerStr.append(":").append(marker.getLocation());
                return markerStr.toString();
            })
            .collect(Collectors.joining("|"));
    }

    /**
     * 构建labels参数，拼接标签相关样式和位置
     * 过滤掉内容为空或位置为空的标签，确保只有有效的标签才会被包含
     * @param labels 标签列表
     * @return 拼接好的labels参数字符串
     */
    private String buildLabelsParam(List<StaticMapRequest.Label> labels) {
        return labels.stream()
                .filter(label -> label != null && 
                               label.getContent() != null && !label.getContent().trim().isEmpty() &&
                               label.getLocation() != null && !label.getLocation().trim().isEmpty())
                .map(label -> {
                    StringBuilder labelStr = new StringBuilder();
                    labelStr.append(label.getContent().trim()).append(","); // 标签内容
                    labelStr.append(label.getFont() != null ? label.getFont() : 0).append(",");    // 字体
                    labelStr.append(label.getBold() != null ? label.getBold() : 0).append(",");    // 是否粗体
                    labelStr.append(label.getFontSize() != null ? label.getFontSize() : 10).append(","); // 字体大小
                    labelStr.append(label.getFontColor() != null ? label.getFontColor() : "0xFFFFFF").append(","); // 字体颜色
                    labelStr.append(label.getBackground() != null ? label.getBackground() : "0x5288d8"); // 背景色
                    labelStr.append(":").append(label.getLocation().trim()); // 标签经纬度
                    return labelStr.toString();
                })
                .collect(Collectors.joining("|"));
    }

    /**
     * 构建paths参数，拼接路径/多边形相关样式和点位
     * @param paths 路径列表
     * @return 拼接好的paths参数字符串
     */
    private String buildPathsParam(List<StaticMapRequest.Path> paths) {
        return paths.stream()
                .map(path -> {
                    StringBuilder pathStr = new StringBuilder();
                    pathStr.append(path.getWeight() != null ? path.getWeight() : 5).append(","); // 线条粗细
                    pathStr.append(path.getColor() != null ? path.getColor() : "0x0000FF").append(",");  // 线条颜色
                    pathStr.append(path.getTransparency() != null ? path.getTransparency() : 1.0).append(","); // 透明度
                    if (path.getFillColor() != null && !path.getFillColor().isEmpty()) {
                        pathStr.append(path.getFillColor()).append(","); // 多边形填充色
                        pathStr.append(path.getFillTransparency() != null ? path.getFillTransparency() : 0.5); // 填充透明度
                    }
                    pathStr.append(":");
                    if (path.getLocations() != null && !path.getLocations().isEmpty()) {
                        pathStr.append(String.join(";", path.getLocations())); // 路径点位
                    }
                    return pathStr.toString();
                })
                .collect(Collectors.joining("|"));
    }

    /**
     * 获取静态地图图片，返回图片二进制数据
     * @param request 地图参数对象
     * @return 地图图片的二进制数据
     */
    public byte[] getStaticMapImage(StaticMapRequest request) {
        String url = generateStaticMapUrl(request); // 先拼接URL
        return restTemplate.getForObject(url, byte[].class); // 请求高德API，获取图片
    }

    /**
     * 根据经纬度生成简单的地图URL（只包含中心点、缩放、key）
     * @param longitude 经度
     * @param latitude 纬度
     * @param zoom 缩放级别
     * @return 拼接好的高德API请求URL
     */
    public String generateSimpleMapUrl(String longitude, String latitude, Integer zoom) {
        StringBuilder urlBuilder = new StringBuilder(config.getStaticMapUrl());
        urlBuilder.append("?");
        urlBuilder.append("location=").append(longitude).append(",").append(latitude).append("&");
        urlBuilder.append("zoom=").append(zoom != null ? zoom : 10).append("&");
        urlBuilder.append("size=400*400&");
        urlBuilder.append("key=").append(config.getKey());
        return urlBuilder.toString();
    }
} 